Mos funksiyalardan ustunlik qilish orqali Pandasning to'liq imkoniyatlaridan foydalaning. Ushbu qo'llanma professional ma'lumotlar tahlili uchun apply(), map() va applymap() ning farqlari, samaradorligi va eng yaxshi ishlatish holatlarini batafsil bayon qiladi.
Pandasdan ustunlik: apply(), map() va applymap() bilan mos funksiyalar bo'yicha chuqur tahlil
Ma'lumotlar fani va tahlili dunyosida Pythonning Pandas kutubxonasi ajralmas vositadir. U tuzilgan ma'lumotlar bilan ishlashni oson va intuitiv qilish uchun mo'ljallangan kuchli, moslashuvchan va samarali ma'lumotlar tuzilmalarini taqdim etadi. Pandas agregatsiyalash, filtrlash va o'zgartirishlar uchun boy funksiyalar to'plamiga ega bo'lsa-da, har bir ma'lumot professionali faoliyatining ma'lum bir nuqtasida ular etarli bo'lmaydi. Siz o'zingizning mos mantiqingizni, noyob biznes qoidasini yoki osonlik bilan mavjud bo'lmagan murakkab o'zgartirishni qo'llashingiz kerak.Bu yerda mos funksiyalarni qo'llash qobiliyati super kuchga aylanadi. Biroq, Pandas buni amalga oshirishning bir necha usullarini taklif etadi, asosan apply(), map() va applymap() usullari orqali. Yangi boshlovchilar uchun bu funksiyalar chalkash va o'xshash ko'rinishi mumkin. Qaysi birini ishlatish kerak? Qachon? Va ularning tanlovining samaradorlik oqibatlari qanday?
Ushbu keng qamrovli qo'llanma ushbu kuchli usullarni tushunishga yordam beradi. Har birini batafsil o'rganamiz, ularning o'ziga xos ishlatish holatlarini tushunamiz va eng muhimi, toza, samarali va o'qiladigan Pandas kodini yozish uchun ish uchun to'g'ri vositani qanday tanlashni o'rganamiz. Biz qoplaymiz:
map()usuli: Yagona Seriyada element-bo'yicha o'zgartirish uchun ideal.apply()usuli: Ma'lumotlar ramkasida qator-bo'yicha yoki ustun-bo'yicha operatsiyalar uchun ko'p qirrali ishchi ot.applymap()usuli: Butun ma'lumotlar ramkasi bo'ylab element-bo'yicha operatsiyalar uchun mutaxassis.- Samaradorlikni hisobga olish: Ushbu usullar va haqiqiy vektorizatsiya o'rtasidagi muhim farq.
- Eng yaxshi amaliyotlar: Har safar eng samarali usulni tanlashga yordam beradigan qaror qabul qilish tizimi.
Bosqichni belgilash: Bizning namunaviy ma'lumotlar to'plamimiz
Misollarimizni amaliy va tushunarli qilish uchun biz doimiy, global miqyosda tegishli ma'lumotlar to'plami bilan ishlaymiz. Biz xayoliy xalqaro elektron tijorat kompaniyasining onlayn savdo ma'lumotlarini aks ettiruvchi namunaviy ma'lumotlar ramkasini yaratamiz.
import pandas as pd
import numpy as np
data = {
'OrderID': [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008],
'Product': ['Laptop', 'Mouse', 'Keyboard', 'Monitor', 'Webcam', 'Headphones', 'Docking Station', 'Mouse'],
'Category': ['Electronics', 'Accessories', 'Accessories', 'Electronics', 'Accessories', 'Audio', 'Electronics', 'Accessories'],
'Price_USD': [1200, 25, 75, 300, 50, 150, 250, 30],
'Quantity': [1, 2, 1, 2, 1, 1, 1, 3],
'Country': ['USA', 'Canada', 'USA', 'Germany', 'Japan', 'Canada', 'Germany', np.nan]
}
df = pd.DataFrame(data)
print(df)
Ushbu ma'lumotlar ramkasi bizga maqsadli funksiyalarimizning to'liq imkoniyatlarini namoyish qilish uchun turli xil ma'lumot turlarini (raqamli, qator va hatto yo'qolgan qiymat) beradi.
map() Usuli: Seriya uchun element-bo'yicha o'zgartirish
map() nima?
map() usuli - bu bitta ustundagi (Pandas Series) qiymatlarni o'zgartirish uchun mo'ljallangan maxsus vositangizdir. U element-bo'yicha ishlaydi. Uni shunday deb o'ylang: "Bu ustundagi har bir element uchun, uni lug'atda qidiring yoki uni ushbu funksiya orqali o'tkazing va natija bilan almashtiring."
U asosan ikki vazifa uchun ishlatiladi:
- Lug'atga asoslangan qiymatlarni almashtirish (xaritalash).
- Har bir elementga sodda funksiyani qo'llash.
1-ishlatish holati: Lug'at bilan qiymatlarni xaritalash
Bu map() ning eng keng tarqalgan va samarali ishlatilishi. Tasavvur qiling, biz 'Category' ustunimizga asoslanib kengroq 'Department' ustunini yaratmoqchimiz. Biz Python lug'atida xaritalashni aniqlay olamiz va uni qo'llash uchun map() dan foydalanamiz.
category_to_department = {
'Electronics': 'Technology',
'Accessories': 'Peripherals',
'Audio': 'Technology'
}
df['Department'] = df['Category'].map(category_to_department)
print(df[['Category', 'Department']])
Natija:
Category Department
0 Electronics Technology
1 Accessories Peripherals
2 Accessories Peripherals
3 Electronics Technology
4 Accessories Peripherals
5 Audio Technology
6 Electronics Technology
7 Accessories Peripherals
Bu qanchalik oson ishlashiga e'tibor bering. 'Category' Seriyasidagi har bir qiymat `category_to_department` lug'atida qidiriladi va mos keladigan qiymat yangi 'Department' ustunini to'ldirish uchun ishlatiladi. Agar lug'atda kalit topilmasa, map() NaN (Raqam emas) qiymatini hosil qiladi, bu ko'pincha xaritalanmagan toifalar uchun istalgan natijadir.
2-ishlatish holati: map() bilan funksiyani qo'llash
Siz shuningdek, funksiyani (lambda funksiyasi ham) map() ga o'tkazishingiz mumkin. Funksiya Seriyadagi har bir element uchun ishga tushiriladi. Keling, narx uchun tushunarli yorliqni beruvchi yangi ustun yarataylik.
def price_label(price):
if price > 200:
return 'High-Value'
elif price > 50:
return 'Mid-Value'
else:
return 'Low-Value'
df['Price_Label'] = df['Price_USD'].map(price_label)
# Oddiy vazifa uchun lambda funksiyasidan foydalanish:
# df['Product_Length'] = df['Product'].map(lambda x: len(x))
print(df[['Product', 'Price_USD', 'Price_Label']])
Natija:
Product Price_USD Price_Label
0 Laptop 1200 High-Value
1 Mouse 25 Low-Value
2 Keyboard 75 Mid-Value
3 Monitor 300 High-Value
4 Webcam 50 Low-Value
5 Headphones 150 Mid-Value
6 Docking Station 250 High-Value
7 Mouse 30 Low-Value
map() qachon ishlatiladi: Tezkor xulosa
- Siz bitta ustun (Seriya) ustida ishlamoqdasiz.
- Siz qiymatlarni lug'at yoki boshqa Seriyaga asoslanib almashtirishni xohlaysiz. Bu uning asosiy kuchi.
- Siz bitta ustunga oddiy element-bo'yicha funksiyani qo'llashingiz kerak.
apply() Usuli: Ko'p qirrali ishchi ot
apply() nima?
Agar map() mutaxassis bo'lsa, apply() umumiy maqsadli kuchli vositasidir. U Seriyalar va Ma'lumotlar ramkalari hamda ularda ishlash qobiliyati tufayli yanada moslashuvchan. apply() ni tushunishning kaliti axis parametridir, u uning operatsiyasini boshqaradi:
- Seriyada: U element-bo'yicha,
map()ga o'xshash ishlaydi. - Ma'lumotlar ramkasida
axis=0(standart) bilan: U funksiyani har bir ustunga qo'llaydi. Funksiya har bir ustunni Seriya sifatida qabul qiladi. - Ma'lumotlar ramkasida
axis=1bilan: U funksiyani har bir qatorga qo'llaydi. Funksiya har bir qatorni Seriya sifatida qabul qiladi.
Seriyada apply()
Seriyada ishlatilganda, apply() map() ga juda o'xshash ishlaydi. U har bir elementga funksiyani qo'llaydi. Masalan, biz narx yorlig'i misolini takrorlay olamiz.
df['Price_Label_apply'] = df['Price_USD'].apply(price_label)
print(df['Price_Label_apply'].equals(df['Price_Label'])) # Natija: True
Garchi ular bu yerda almashtiriladigan bo'lsa-da, map() odatda sodda lug'at almashtirishlari va Seriyada element-bo'yicha operatsiyalar uchun biroz tezroq bo'ladi, chunki u ushbu maxsus vazifalar uchun yanada optimallashtirilgan yo'nalishga ega.
Ma'lumotlar ramkasida apply() (Ustun-bo'yicha, axis=0)
Bu Ma'lumotlar ramkasi uchun standart rejimdir. Siz taqdim etgan funksiya har bir ustun uchun bir marta chaqiriladi. Bu ustun-bo'yicha agregatsiyalar yoki o'zgartirishlar uchun foydalidir.
Keling, bizning har bir raqamli ustunimiz uchun maksimal va minimal qiymat (oralig'i) o'rtasidagi farqni topaylik.
numeric_cols = df[['Price_USD', 'Quantity']]
def get_range(column_series):
return column_series.max() - column_series.min()
column_ranges = numeric_cols.apply(get_range, axis=0)
print(column_ranges)
Natija:
Price_USD 1175.0
Quantity 2.0
dtype: float64
Bu yerda, get_range funksiyasi birinchi bo'lib 'Price_USD' Seriyasini qabul qildi, uning oralig'ini hisoblab chiqdi, keyin 'Quantity' Seriyasini qabul qildi va shuni qildi, natijalar bilan yangi Seriya qaytardi.
Ma'lumotlar ramkasida apply() (Qator-bo'yicha, axis=1)
Bu, ehtimol, apply() ning eng kuchli va keng tarqalgan ishlatish holatidir. Bir xil qatordagi bir nechta ustunlarga asoslangan yangi qiymatni hisoblash kerak bo'lganda, apply() axis=1 bilan sizning asosiy vositangizdir.
Siz taqdim etgan funksiya har bir qatorni Seriya sifatida qabul qiladi, bu yerda indeks ustun nomlari hisoblanadi. Keling, har bir buyurtma uchun umumiy narxni hisoblaylik.
def calculate_total_cost(row):
# 'row' - bu bitta qatorni aks ettiruvchi Seriya
price = row['Price_USD']
quantity = row['Quantity']
return price * quantity
df['Total_Cost'] = df.apply(calculate_total_cost, axis=1)
print(df[['Product', 'Price_USD', 'Quantity', 'Total_Cost']])
Natija:
Product Price_USD Quantity Total_Cost
0 Laptop 1200 1 1200
1 Mouse 25 2 50
2 Keyboard 75 1 75
3 Monitor 300 2 600
4 Webcam 50 1 50
5 Headphones 150 1 150
6 Docking Station 250 1 250
7 Mouse 30 3 90
Bu map() ning bajara olmaydigan narsasi, chunki u bitta ustun bilan cheklangan. Keling, yanada murakkab misolni ko'rib chiqaylik. Biz har bir buyurtmani uning toifasi va mamlakati asosida etkazib berish ustuvorligini tasniflamoqchimiz.
def assign_shipping_priority(row):
if row['Category'] == 'Electronics' and row['Country'] == 'USA':
return 'High Priority'
elif row['Total_Cost'] > 500:
return 'High Priority'
elif row['Country'] == 'Japan':
return 'Medium Priority'
else:
return 'Standard'
df['Shipping_Priority'] = df.apply(assign_shipping_priority, axis=1)
print(df[['Category', 'Country', 'Total_Cost', 'Shipping_Priority']])
apply() qachon ishlatiladi: Tezkor xulosa
- Sizning mantiqingiz qatordagi bir nechta ustunlarga bog'liq bo'lganda (
axis=1dan foydalaning). Bu uning asosiy xususiyati. - Ustunlar bo'ylab yoki qatorlar bo'ylab agregatsiyalash funksiyasini qo'llash kerak bo'lganda.
map()mos kelmaganda umumiy maqsadli funksiyani qo'llash vositasi sifatida.
Maxsus eslatma: applymap() Usuli
applymap() nima?
applymap() usuli yana bir mutaxassisdir, lekin uning sohasi butun Ma'lumotlar ramkasidir. U funksiyani Ma'lumotlar ramkasining har bir elementiga qo'llaydi. U Seriyada ishlamaydi - bu faqat Ma'lumotlar ramkasi usuli.
Uni barcha xujayralar bo'ylab keng, keng qamrovli o'zgartirishlar, masalan, formatlash yoki turli xil konversiyalash kabi ishlar uchun foydali deb o'ylang.
Muhim eslatma: Pandas 2.1.0 dan boshlab,DataFrame.applymap() tavsiya etilmaydi. Tavsiya etilgan yangi usul DataFrame.map() dan foydalanishdir. Funksionallik bir xil. Biz moslik uchun bu yerda applymap() dan foydalanamiz, lekin kelajakdagi kod uchun bu o'zgarishdan xabardor bo'ling.
Amaliy misol
Tasavvur qiling, bizda faqat raqamli ustunlarimiz bo'lgan kichik ma'lumotlar ramkamiz bor va biz ularni hisobot uchun barchasini valyuta qatorlariga formatlamoqchimiz.
numeric_df = df[['Price_USD', 'Quantity', 'Total_Cost']]
# Har bir raqamni formatlash uchun lambda funksiyasidan foydalanish
formatted_df = numeric_df.applymap(lambda x: f'${x:,.2f}')
print(formatted_df)
Natija:
Price_USD Quantity Total_Cost 0 $1,200.00 $1.00 $1,200.00 1 $25.00 $2.00 $50.00 2 $75.00 $1.00 $75.00 3 $300.00 $2.00 $600.00 4 $50.00 $1.00 $50.00 5 $150.00 $1.00 $150.00 6 $250.00 $1.00 $250.00 7 $30.00 $3.00 $90.00
Yana bir keng tarqalgan foydalanish, masalan, barcha narsalarni kichik harflarga aylantirish orqali qator ma'lumotlarining ma'lumotlar ramkasini tozalashdir.
string_df = df[['Product', 'Category', 'Country']].copy() # SettingWithCopyWarning dan qochish uchun nusxachani yarating
# Barcha qiymatlarning qator ekanligiga ishonch hosil qiling, xatolarni oldini olish uchun
string_df = string_df.astype(str)
lower_df = string_df.applymap(str.lower)
print(lower_df)
applymap() qachon ishlatiladi: Tezkor xulosa
- Butun Ma'lumotlar ramkasidagi har bir elementga bitta, sodda funksiyani qo'llash kerak bo'lganda.
- Ma'lumotlar turi konversiyasi, qator formatlash yoki butun Ma'lumotlar ramkasi bo'ylab oddiy matematik o'zgartirishlar kabi vazifalar uchun.
- So'nggi Pandas versiyalarida
DataFrame.map()foydasiga tavsiya etilmasligini yodda tuting.
Samaradorlik chuqur tahlili: Vektorizatsiya vs. Iteratsiya
"Yashirin" tsikl
Bu Pandas kodini yuqori samaradorlik bilan yozish uchun tushunish eng muhim konsepsiyadir. apply(), map() va applymap() qulay bo'lsa-da, ular asosan Python tsikli atrofidagi ajoyib qoplamalardir. Siz df.apply(..., axis=1) dan foydalanganda, Pandas ma'lumotlar ramkasini qatorma-qator iteratsiya qiladi, ularning har birini sizning funksiyangizga o'tkazadi. Ushbu jarayon sezilarli darajada ko'proq resurs talab qiladi va C yoki Cythonda optimallashtirilgan operatsiyalardan ancha sekinroqdir.
Vektorizatsiya kuchi
Vektorizatsiya - bu butun massivlar (yoki Seriyalar) ustida bir vaqtning o'zida operatsiyalar bajarish, individual elementlarga emas. Pandas va uning asosiy kutubxonasi NumPy, ayniqsa vektorlashtirilgan operatsiyalarda juda tez bo'lish uchun maxsus ishlab chiqilgan.
Keling, 'Total_Cost' hisob-kitobimizga qaytaylik. Biz apply() dan foydalandik, lekin vektorlashtirilgan usuli bormi?
# 1-usul: apply() dan foydalanish (Iteratsiya)
df['Total_Cost'] = df.apply(lambda row: row['Price_USD'] * row['Quantity'], axis=1)
# 2-usul: Vektorlashtirilgan operatsiya
df['Total_Cost_Vect'] = df['Price_USD'] * df['Quantity']
# Natijalar bir xilmi, tekshiring
print(df['Total_Cost'].equals(df['Total_Cost_Vect'])) # Natija: True
Ikkinchi usul vektorlashtirilgandir. U butun 'Price_USD' Seriyasini oladi va uni butun 'Quantity' Seriyasiga bir marta, yuqori darajada optimallashtirilgan operatsiyada ko'paytiradi. Agar siz ushbu ikki usulni katta ma'lumotlar ramkasida (milyonlab qatorlar) vaqt bo'yicha sinab ko'rsangiz, vektorlashtirilgan yondashuv nafaqat tezroq bo'ladi - u tartib bo'yicha tezroq bo'ladi. Biz soniyalarni daqiqalar bilan, yoki daqiqalarni soatlar bilan solishtiryapmiz.
apply() qachon qochish mumkin emas?
Agar vektorizatsiya shunchalik tez bo'lsa, nega bu boshqa usullar mavjud? Chunki ba'zida sizning mantiqingiz vektorlashtirish uchun juda murakkabdir. apply() kerakli va to'g'ri vosita:
- Murakkab shartli mantiq: Sizning mantiqingiz ko'p ustunlarga bog'liq bo'lgan murakkab `if/elif/else` bayonotlarini o'z ichiga oladi, masalan, bizning `assign_shipping_priority` misolimiz. Garchi bu narsalarning ba'zilari `np.select()` bilan erishilishi mumkin bo'lsa-da, u o'qilarsiz bo'lib qolishi mumkin.
- Tashqi kutubxona funksiyalari: Siz o'zingizning ma'lumotlaringizga tashqi kutubxonadan funksiyani qo'llashingiz kerak. Masalan, kenglik va uzunlik ustunlariga asoslanib masofani hisoblash uchun geografik kutubxonadan funksiyani qo'llash, yoki matn ustunida hissiy tahlilni bajarish uchun tabiiy tilni qayta ishlash kutubxonasidan (NLTK kabi) funksiyani qo'llash.
- Iterativ jarayonlar: Berilgan qator uchun hisoblash oldingi qatorda hisoblangan qiymatga bog'liq (garchi bu kamdan-kam hollarda va ko'pincha boshqa ma'lumotlar tuzilmasi zarurligini ko'rsatuvchi belgi bo'lsa-da).
Eng yaxshi amaliyot: Birinchi vektorlashtiring, keyin apply()
Bu Pandas samaradorligining oltin qoidasiga olib keladi:
Har doim birinchi navbatda vektorlashtirilgan yechimni qidiring. Vektorlashtirilgan yechim amaliy yoki mumkin bo'lmaganda, kuchli, moslashuvchan zaxira sifatida apply() dan foydalaning.
Xulosa va asosiy ma'lumotlar: To'g'ri vositani tanlash
Pandasda mos funksiyalarni qo'llash variantlarini boshqarish har qanday ma'lumot amaliyotchisi uchun o'tish marosimidir. Garchi ular birinchi qarashda o'zaro almashtiriladigan bo'lib ko'rinsa-da, map(), apply() va applymap() har biri o'z kuchli tomonlari va ideal ishlatish holatlariga ega bo'lgan alohida vositalardir. Ularning farqlarini tushunish orqali siz nafaqat to'g'ri, balki yanada o'qiladigan, qo'llab-quvvatlanadigan va sezilarli darajada samaraliroq kod yozishingiz mumkin.
Quyidagi ierarxiyani yodda tuting: uning xom tezligi uchun vektorizatsiyani afzal ko'ring, uning samarali Seriya almashtirishlari uchun map() dan foydalaning, Ma'lumotlar ramkasi bo'ylab o'zgartirishlar uchun applymap() ni tanlang va vektorlashtirilmaydigan murakkab qator-bo'yicha yoki ustun-bo'yicha mantiq uchun apply() ning kuchi va moslashuvchanligidan foydalaning. Ushbu bilim bilan qurollangan, siz endi har qanday ma'lumotlarni manipulyatsiya qilish muammosiga malaka va samaradorlik bilan duch kelishga, xom ma'lumotlarni kuchli tahlillarga aylantirishga tayyormiz.